LitePal 1.3.1发布了,从此支持图片存储!
今天LitePal又发布新版本了,带来了众望所归的二进制数据存储功能,有了这个功能,从此图片存储再也不用伤脑筋了。
只需在你的build.gradle文件当中添加下面引用即可完成升级。
compile 'org.litepal.android:core:1.3.1'
这次LitePal的更新主要包括了以下内容:
优化查询算法,使得查询速度变得更快。
增加saveFast()方法,使得存储速度变得更快。
支持二进制数据存储功能。
下面我们根据这三点更新内容分别展开详细的描述。
优化查询算法:
LitePal的查询速度其实并不慢, 因为在底层使用的就是SQLiteDatabase的API来查询的,只不过做了很多层封装而已。LitePal实际上是慢在赋值上面,因为为了简化开发者的操作,LitePal把查询和赋值这两步合到一步到当中了。我们知道,使用原生的API是要先查询得到一个Cursor对象,然后再从Cursor中把数据一个个取出并赋值到我们自己的对象当中。那么LitePal是如何做到把这两步合为一步呢?当然是借助反射了,而反射比起直接调用接口肯定是要慢一些的,这个无论如何都无可避免,所以这就是开发效率和运行效率之间的取舍。不过在反射不能变的大前提下,这次1.3.1的版本在查询算法上面进行了改进,使用一些缓存属性来提升查询效率,总体来说要比上一个版本性能好上很多。
saveFast()方法:
查询效率有了提升,那么这次在存储效率上也有了改进。之前存储我们都是用的save()方法,这个方法的强大之处在于,不仅可以将当前Model中的数据存入到相应的表中,还会分析Model之间的关联关系,并把关联关系自动解析成外键存入到表中。但是缺点在于save()方法无法事先知道当前Model有没有任何关联关系,或者开发者希不希望去分析关联关系,因此只能每次都去主动去分析,这样就会把很大一部分处理存储的时间花在分析关联上面,从而导致存储效率偏低。
那么1.3.1版本中提供的saveFast()方法则很好地解决了这个问题,因为开发者自己是很清楚当前Model是否需要处理关联关系的,如果这只是一个独立的Model,和其它Model没有任何关联,那么就可以调用saveFast()方法,从而大大提升存储效率。saveFast()方法的调用方式和save()方法是完全一样的:
Product product = new Product();product.setName("Android Phone");
product.setPrice(1999.99);
product.saveFast();
存储二进制数据:
LitePal之前支持存储的数据类型有:int、long、short、float、double、boolean、char、String、Date九种,1.3.1版本中引入了第十种数据类型:byte[]。
也就是说,我们在Model中声明一个byte[]类型的字段,这个字段就会被自动映射到数据库表当中了。
byte[]类型的字段灵活性非常高,它可以用来存储图片,但又不仅限于存储图片,任何二进制的数据都是可以存储的,比如一段小语音,或者是小视频,但不建议在手机数据库中存储较大的二进制数据。
下面来举个具体使用的例子,首先我们在Model中添加一个byte[]类型的字段:
private String name;
private double price;
private byte[] image;
// generated getters and setters. ...
}
然后存储一张图片时就可以这样写:
byte[] imageBytes = getImageBytesFromSomewhere();Product product = new Product();
product.setName("Android Phone");
product.setPrice(1999.99);
product.setImage(imageBytes);
product.saveFast();
用法非常简单吧,那存储成功了查询该怎么写呢?查询的写法完全没有改变,自动就可以把当前对象的二进制数据一起给查出来:
String name = product.getName();
double price = product.getPrice();
byte[] imageBytes = product.getImage();
但是如果有时候我想只查一些基本数据呢?毕竟把二进制数据一起查出来了肯定会影响效率的,这种情况我们可以借助LitePal的级联查询来解决:
这种写法指定只查询name和price这两列,image这一列数据是不会被查询出来的,因此就完全不会影响效率了。
这次版本的主要更新内容大概就是这些了,点击阅读原文可以访问LitePal项目的主页。